import Vue from "vue";
import { Ref } from '@vue/composition-api';
import { SellerData, UserRemark } from './../globalType';
export interface VueStorage<T extends object> extends Vue {
    $storage?: T;
}
// interface KeyIndexObject {
//     [key: string]: any;
// }
interface DataStorage {
    seller?: SellerData;
    ratings?: Array<UserRemark>;
}

export const PublicStorage: VueStorage<DataStorage> = new Vue();
const EventRecord = new Set<string>();

// 数据仓库传递函数
// export function storagePass(eventName: string, ...data: unknown[]) {
//     if (EventRecord.has(eventName)) {
//         throw new Error('事件名：' + eventName + '已经被占用');
//     }
//     EventRecord.add(eventName);
//     PublicStorage.$emit(eventName, ...data);
// }
// 监听传递数据通信函数
// export function storageAction(eventName: string, ...data: Ref[]) {
//     PublicStorage.$once(eventName, (...res: any[]) => {
//         if (EventRecord.has(eventName) === false) {
//             console.warn('事件名：' + eventName + '暂未被注册，请检查输入');
//             return;
//         }
//         res.forEach((res: any, index: number) => {
//             data[index].value = res;
//         })
//     });
// }
// 数据仓库传递函数
export function storagePass(eventName: string, ...data: unknown[]) {
    if (EventRecord.has(eventName) === false) {
        console.warn('事件名：' + eventName + '暂未被注册，请检查输入');
    }
    PublicStorage.$emit(eventName, ...data);
}
// 监听传递数据通信函数
export function storageAction(eventName: string, ...data: Ref[]) {
    if (EventRecord.has(eventName)) {
        throw new Error('事件名：' + eventName + '已经被占用');
    } else {
        EventRecord.add(eventName);
    }
    PublicStorage.$once(eventName, (...res: any[]) => {
        res.forEach((res: any, index: number) => {
            data[index].value = res;
        })
    });
}

// 数据仓库执行回调函数
export function storageEffect(eventName: string, cbFunc: Function) {
    if (EventRecord.has(eventName)) {
        throw new Error('事件名：' + eventName + '已经被占用');
    } else {
        EventRecord.add(eventName);
    }
    PublicStorage.$on(eventName, (...res: any[]) => {
        cbFunc(...res);
    });
}

// 数据仓库执行数据存储
export function storageSetData<T extends keyof DataStorage>(key: T, data: DataStorage[T]) {
    if (key in PublicStorage) {
        console.trace('意料之外的错误：存储所用的key值已被占用，参数：', data);
    }
    if (PublicStorage.$storage == null) PublicStorage.$storage = {};
    PublicStorage.$storage[key] = data;
    console.log('数据仓库已注册，key值：', key);
}
// 数据仓库执行数据存储
export function storageGetData<T extends keyof DataStorage>(key: T): DataStorage[T] {
    if (PublicStorage.$storage && key in PublicStorage.$storage) {
        return PublicStorage.$storage[key];
    } else {
        console.trace('意料之外的错误：输入的key值不存在或未初始化仓库，参数：', key);
        throw new Error('Error happened in storageGetData');
    }
}
